import pymysql

class DbUtils:
    # 初始化数据库连接参数
    def __init__(self, host='localhost', user='root', password='123456', db='mini_blog', port='4000'):
        self.host = host
        self.user = user
        self.password = password
        self.db = db
        self.port = int(port) 
        self.conn = None

    # 连接数据库
    def connect(self):
        # 连接到数据库
        self.conn = pymysql.connect(
            host=self.host,  # 主机名
            user=self.user,  # 用户名
            password=self.password,  # 密码
            db=self.db,  # 数据库名
            port=self.port,  # 端口号
            charset='utf8mb4',  # 字符集
            cursorclass=pymysql.cursors.DictCursor  # 游标类型
        )
        return self.conn  # 返回连接对象

    # 执行查询语句
    def query(self, sql, params=None):
        # 如果没有连接，则连接数据库
        if not self.conn:
            self.connect()
        try:
            # 使用with语句创建游标
            with self.conn.cursor() as cursor:
                # 执行SQL语句
                cursor.execute(sql, params)
                # 获取所有结果
                result = cursor.fetchall()
                # 返回结果
                return result
        except Exception as e:
            # 打印错误信息
            print(f"Query error: {e}")
            # 返回None
            return None

    # 执行插入、更新、删除等操作
    def execute(self, sql, params=None):
        # 如果没有连接，则连接数据库
        if not self.conn:
            self.connect()
        try:
            # 使用上下文管理器，确保在操作完成后关闭游标
            with self.conn.cursor() as cursor:
                # 执行SQL语句
                cursor.execute(sql, params)
                # 提交事务
                self.conn.commit()
                # 返回受影响的行数
                return cursor.rowcount
        except Exception as e:
            # 打印错误信息
            print(f"Execute error: {e}")
            # 回滚事务
            self.conn.rollback()
            # 返回None
            return None

    # 关闭数据库连接
    def close(self):
        # 如果self.conn存在，则关闭连接
        if self.conn:
            self.conn.close()